<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /* 
            面向对象 
            仅仅是个开发思想   用人的思维去写代码 
            本质: 对面向过程(函数)的高度封装
            核心: 高内聚低耦合

            思想:
                当你需要开发一个功能的时候 首先找到一个机器 
                这个机器可以批量创造具有完整功能的对象  
                第三方如果导入这个机器  
                如果没有自己造


            构造函数   其实就是函数 
                必须和new 关键字一起用  自动创建对象  自动返回对象 
                首字母大写 大驼峰 
                不写return  
                函数体内的this 指向当前创建的对象  
        
            构造函数不合理的地方 
                如果我们在构造函数中写方法 
                每实例化一个对象 就要开辟一个新的函数空间 
                随着实例的增加 需要的空间越来越大 

            原型 
                每个函数天生自带一个属性prototype(原型) 是个对象数据类型
                (构造函数也是函数  内置构造函数也是函数)
                每个对象天生自带一个属性 __proto__ ,指向所属构造函数的原型  
                比如 Peron()   p1 = new Person()
                // p1.__proto__ === Peron.prototype   true 
                // 任何数组的__proto__ === Array.prototype  true 
                // 任何字符串__proto__ === String.prototype  true

                当我们访问 对象的时候首先查看对象身上是否有 
                如果有直接输出  
                如果没有 会自动到自己的__proto__ 上找 
                __proto__ 指向所属构造函数的prototype  
                
            结论 :
                以后写构造函数 
                属性构造函数内部 
                方法写在 构造函数的原型上 (只要是构造函数实例化的对象都可以访问到这些方法)


            es6面向对象 
                class 类名{
                    constructor(){
                        属性写在构造器中 
                    }

                    方法1(){

                    }

                    方法2(){

                    }
                }

                    
                    
        
        
        
        
        */

        function Peron(name,age){
            this.name = name;
            this.age = age;
        }

        Peron.prototype.eat = function(){
            return  this.name + '正在吃';
        }


        const p1 = new Peron('张三',18);

        console.log(p1.name);
        console.log(p1.age);
        console.log(p1.eat());
        // p1身上没有eat  那就自动到 __proto__ 上找 
        //  __proto__  =>   Peron.prototype 

        // Peron.prototype上面有eat  所以 p1可以直接使用eat


    </script>
</body>
</html>